{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PPO agent using stable-baselines3\n",
    "\n",
    "In this notebook, we will look at policy optimization using PPO. We will not be writing our own algorithms. Rather, we will use a fork of [OpenAI Baselines](https://github.com/openai/baselines). The version we will use is still stable-baselines3 : https://github.com/DLR-RM/stable-baselines3\n",
    "\n",
    "\n",
    "The code below follows the [getting started tutorial](https://colab.research.google.com/github/Stable-Baselines-Team/rl-colab-notebooks/blob/sb3/stable_baselines_getting_started.ipynb) that comes with this library. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Running in Colab/Kaggle\n",
    "\n",
    "If you are running this on Colab, please uncomment below cells and run this to install required dependencies."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "## Uncomment and execute this cell to install all the the dependencies if running in Google Colab\n",
    "\n",
    "# !apt-get update && apt-get install swig cmake ffmpeg freeglut3-dev xvfb\n",
    "# !pip install box2d-py\n",
    "# !pip install \"stable-baselines3[extra]>=2.1\"\n",
    "# !pip install \"huggingface_sb3>=3.0\"\n",
    "\n",
    "# !pip install git+https://github.com/DLR-RM/rl-baselines3-zoo@update/hf\n",
    "# !git clone https://github.com/DLR-RM/rl-baselines3-zoo\n",
    "# %cd rl-baselines3-zoo/\n",
    "# !pip install -r requirements.txt\n",
    "# %cd ..\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import gymnasium as gym\n",
    "import random\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from stable_baselines3 import PPO\n",
    "from stable_baselines3.ppo.policies import MlpPolicy\n",
    "from stable_baselines3.common.vec_env import VecVideoRecorder, DummyVecEnv\n",
    "from stable_baselines3.common.evaluation import evaluate_policy\n",
    "from stable_baselines3.common.monitor import Monitor\n",
    "\n",
    "from IPython.display import HTML, clear_output\n",
    "from base64 import b64encode\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Environment - CartPole \n",
    "\n",
    "We can use the setup here to run on any environment which has state as a single vector and actions are discrete. We will build it on Cart Pole and they try to run this on many other environments like Atari games and others."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_env(env_name):\n",
    "    env = gym.make(env_name, render_mode=\"rgb_array\")\n",
    "    return env"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "state shape:(4,)\n",
      "Number of Actions:2\n"
     ]
    },
    {
     "data": {
      "image/png": "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iorM7t27zeuvv25Gjx5tKisr3dglV/zXf/2X+fWvf23++Mc/mvr6evP973/fJCUlmX379hljGMO+2rlzp7n44otNQUGB+c53vuOsZzzPzfLly81VV11lGhsbneXYsWNOO+PorrgLKNdcc40pKytzXvf09JicnBxTVVXlYlV2+3xAiUQiJhAImCeeeMJZ19LSYlJSUszPfvYzY4wx7733npFkdu3a5fTZsGGD8Xg85i9/+cuA1W6b5uZmI8lUV1cbYz4bt6SkJPPyyy87fd5//30jydTU1BhjPguLXq/XhEIhp8/KlSuNz+czHR0dA7sDFvnSl75k/u3f/o0x7KO2tjYzYcIEs2nTJvO1r33NCSiM57lbvny5mTJlSq9tjKP74uoUT2dnp2pra1VUVOSs83q9KioqUk1NjYuVxZfDhw8rFApFjaPf71dhYaEzjjU1NUpPT9e0adOcPkVFRfJ6vdqxY8eA12yL1tZWSVJGRoYkqba2Vl1dXVFjOXHiROXl5UWN5eTJk5WVleX0KS4uVjgc1v79+wewejv09PRo7dq1OnHihILBIGPYR2VlZSopKYkaN4nfyVh98MEHysnJ0SWXXKL58+eroaFBEuNog7h6WOBHH32knp6eqF8GScrKytKBAwdcqir+hEIhSep1HE+1hUIhZWZmRrUnJiYqIyPD6TPURCIR3XPPPbr22ms1adIkSZ+NU3JystLT06P6fn4sexvrU21Dxd69exUMBnXy5EmlpaVp3bp1ys/PV11dHWMYo7Vr1+r3v/+9du3adVobv5PnrrCwUKtXr9YVV1yhxsZGrVixQl/96le1b98+xtECcRVQADeVlZVp3759evvtt90uJS5dccUVqqurU2trq375y19q0aJFqq6udrusuHPkyBF95zvf0aZNmzRs2DC3y4lrc+bMcX4uKChQYWGhxo0bp1/84hcaPny4i5VBirOreEaPHq2EhITTZlE3NTUpEAi4VFX8OTVWZxrHQCCg5ubmqPbu7m4dP358SI51eXm51q9fr7feektjx4511gcCAXV2dqqlpSWq/+fHsrexPtU2VCQnJ+uyyy7T1KlTVVVVpSlTpujpp59mDGNUW1ur5uZm/dVf/ZUSExOVmJio6upqPfPMM0pMTFRWVhbj2Ufp6em6/PLLdfDgQX4vLRBXASU5OVlTp07V5s2bnXWRSESbN29WMBh0sbL4Mn78eAUCgahxDIfD2rFjhzOOwWBQLS0tqq2tdfps2bJFkUhEhYWFA16zW4wxKi8v17p167RlyxaNHz8+qn3q1KlKSkqKGsv6+no1NDREjeXevXujAt+mTZvk8/mUn58/MDtioUgkoo6ODsYwRjNnztTevXtVV1fnLNOmTdP8+fOdnxnPvmlvb9ehQ4eUnZ3N76UN3J6lG6u1a9ealJQUs3r1avPee++ZJUuWmPT09KhZ1Phshv/u3bvN7t27jSTzL//yL2b37t3mz3/+szHms8uM09PTzauvvmr27Nljbr755l4vM/7yl79sduzYYd5++20zYcKEIXeZ8dKlS43f7zdbt26NuhTxk08+cfrcddddJi8vz2zZssW8++67JhgMmmAw6LSfuhRx1qxZpq6uzmzcuNGMGTNmSF2K+MADD5jq6mpz+PBhs2fPHvPAAw8Yj8djfvOb3xhjGMPz9X+v4jGG8TxX9913n9m6das5fPiw+d3vfmeKiorM6NGjTXNzszGGcXRb3AUUY4z58Y9/bPLy8kxycrK55pprzPbt290uyTpvvfWWkXTasmjRImPMZ5ca/+AHPzBZWVkmJSXFzJw509TX10dt4+OPPzbz5s0zaWlpxufzmW9/+9umra3Nhb1xT29jKMm88MILTp9PP/3U/MM//IP50pe+ZFJTU83f/d3fmcbGxqjt/OlPfzJz5swxw4cPN6NHjzb33Xef6erqGuC9cc/f//3fm3Hjxpnk5GQzZswYM3PmTCecGMMYnq/PBxTG89zcdtttJjs72yQnJ5uLLrrI3HbbbebgwYNOO+PoLo8xxrhz7AYAAKB3cTUHBQAADA0EFAAAYB0CCgAAsA4BBQAAWIeAAgAArENAAQAA1iGgAAAA6xBQAACAdQgoAADAOgQUAABgHQIKAACwDgEFAABY5/8DUcgFO1H4ARQAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "env_name = 'CartPole-v1'\n",
    "seed=123\n",
    "\n",
    "env = make_env(env_name)\n",
    "env.reset(seed=seed)\n",
    "plt.imshow(env.render())\n",
    "state_shape, n_actions = env.observation_space.shape, env.action_space.n\n",
    "state_dim = state_shape[0]\n",
    "print(f\"state shape:{state_shape}\\nNumber of Actions:{n_actions}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create model using `MlpPolicy` from SB3 library "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = PPO(MlpPolicy, env, verbose=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Untrained Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/nsanghi/sandbox/apress/drl-2ed/venv39/lib/python3.9/site-packages/gymnasium/core.py:311: UserWarning: \u001b[33mWARN: env.predict to get variables from other wrappers is deprecated and will be removed in v1.0, to get this variable you can do `env.unwrapped.predict` for environment variables or `env.get_wrapper_attr('predict')` that will search the reminding wrappers.\u001b[0m\n",
      "  logger.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean_reward:9.47 +/- 0.68\n"
     ]
    }
   ],
   "source": [
    "mean_reward, std_reward = evaluate_policy(Monitor(model), env, n_eval_episodes=100)\n",
    "\n",
    "print(f\"mean_reward:{mean_reward:.2f} +/- {std_reward:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train the Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<stable_baselines3.ppo.ppo.PPO at 0x7f6ab068cdc0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Train the agent for 30000 steps\n",
    "model.learn(total_timesteps=30000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Evaluate Trained Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean_reward:500.00 +/- 0.00\n"
     ]
    }
   ],
   "source": [
    "# Evaluate the trained agent\n",
    "mean_reward, std_reward = evaluate_policy(Monitor(model), env, n_eval_episodes=100)\n",
    "\n",
    "print(f\"mean_reward:{mean_reward:.2f} +/- {std_reward:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Trained Agent Video"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Helper function to record videos\n",
    "def record_video(env_id, video_folder, video_length, agent):\n",
    "\n",
    "    vec_env = DummyVecEnv([lambda: gym.make(env_id, render_mode=\"rgb_array\")])\n",
    "    # Record the video starting at the first step\n",
    "    vec_env = VecVideoRecorder(vec_env, video_folder,\n",
    "                           record_video_trigger=lambda x: x == 0, video_length=video_length,\n",
    "                           name_prefix=f\"{type(agent).__name__}-{env_id}\")\n",
    "\n",
    "    obs = vec_env.reset()\n",
    "    for _ in range(video_length + 1):\n",
    "        action, _ = model.predict(obs)\n",
    "        obs, _, _, _ = vec_env.step(action)\n",
    "    # video filename\n",
    "    file_path = \"./\"+video_folder+vec_env.video_recorder.path.split(\"/\")[-1]\n",
    "    # Save the video\n",
    "    vec_env.close()\n",
    "    return file_path\n",
    "\n",
    "def play_video(file_path):\n",
    "    mp4 = open(file_path, 'rb').read()\n",
    "    data_url = \"data:video/mp4;base64,\" + b64encode(mp4).decode()\n",
    "    return HTML(\"\"\"\n",
    "        <video width=400 controls>\n",
    "              <source src=\"%s\" type=\"video/mp4\">\n",
    "        </video>\n",
    "        \"\"\" % data_url)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving video to /home/nsanghi/sandbox/apress/drl-2ed/chapter8/logs/8_c/PPO-CartPole-v1-step-0-to-step-500.mp4\n",
      "Moviepy - Building video /home/nsanghi/sandbox/apress/drl-2ed/chapter8/logs/8_c/PPO-CartPole-v1-step-0-to-step-500.mp4.\n",
      "Moviepy - Writing video /home/nsanghi/sandbox/apress/drl-2ed/chapter8/logs/8_c/PPO-CartPole-v1-step-0-to-step-500.mp4\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                                                        \r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Moviepy - Done !\n",
      "Moviepy - video ready /home/nsanghi/sandbox/apress/drl-2ed/chapter8/logs/8_c/PPO-CartPole-v1-step-0-to-step-500.mp4\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "        <video width=400 controls>\n",
       "              <source src=\"data:video/mp4;base64,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AAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABAAAAAACAAABAAAAAAEAAAIAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAQAAAAAAgAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAQAAAAAAgAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABAAAAAACAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABAAAAAACAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABAAAAAACAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAADAAAAAAEAAAEAAAAAAQAAAgAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAEAAAAAAIAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABAAAAAACAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAEAAAAAAIAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAACAAAAABxzdHNjAAAAAAAAAAEAAAABAAAB9QAAAAEAAAfoc3RzegAAAAAAAAAAAAAB9QAABJsAAABNAAAAIQAAAB8AAAAUAAAAbgAAAD0AAAAhAAAAKAAAAFcAAAA3AAAAJQAAACsAAABLAAAAMgAAACAAAAAnAAAARQAAADMAAAAyAAAAJQAAAGkAAAAsAAAAIgAAACcAAABrAAAAIwAAABQAAAAgAAAAQgAAACUAAAAXAAAAPgAAAFIAAAAyAAAAMwAAAB8AAABPAAAAMgAAACYAAAB1AAAA0gAAAE4AAAAvAAAAOAAAAHoAAAAqAAAAKwAAADYAAABNAAAAKgAAAB8AAAAgAAAAowAAADsAAAAkAAAAKwAAAFcAAABEAAAAKAAAACwAAABCAAAAPgAAACYAAABvAAAAKwAAACIAAAAkAAAAjAAAADkAAAAuAAAAOwAAAGkAAAA8AAAALwAAAC4AAACmAAAAPAAAACsAAAApAAAA9gAAAEIAAABHAAAAPQAAAHIAAABFAAAAMQAAACYAAACaAAAAMAAAAC0AAAAyAAAAmgAAACkAAAAvAAAAcwAAACMAAAASAAAAKAAAAD0AAAAgAAAAFwAAABsAAABSAAAAJwAAACYAAAAeAAAAXwAAACoAAAArAAAAMwAAAIYAAAArAAAAHgAAADMAAAB7AAAARAAAACgAAAAvAAAAYQAAAEcAAAAtAAAAKgAAAFgAAAAxAAAAJAAAAC0AAACMAAAARQAAACoAAAA4AAAAqgAAADwAAAAtAAAARAAAALAAAAA7AAAARgAAAD4AAAC/AAAAMQAAAEAAAABqAAAASwAAACkAAAAlAAAAaQAAACwAAAAnAAAAKwAAAGcAAABFAAAAOQAAADQAAABzAAAAMAAAACMAAAA3AAAAUgAAAC8AAAAhAAAAIwAAAEcAAAAtAAAAIQAAABoAAACfAAAAMQAAACAAAAAyAAAAIgAAACwAAAA1AAAAHAAAABsAAAAUAAAAEgAAABIAAABvAAAATAAAACQAAAAcAAAAVAAAADMAAAAeAAAAIQAAAIkAAAA7AAAAHgAAADEAAABKAAAAOAAAADMAAAAcAAAAXQAAACwAAAAcAAAAIgAAAFoAAAAoAAAAJQAAACcAAACpAAAAMwAAADAAAAAxAAAAgAAAADgAAAAwAAAAbAAAADUAAAAhAAAAHQAAAF0AAABDAAAAIwAAACUAAABHAAAAKQAAAC0AAAAaAAAAUwAAACIAAAAdAAAAFgAAAGEAAAAgAAAAMAAAAGkAAABPAAAAKgAAAB0AAAAbAAAAFgAAABIAAAASAAAAWQAAADUAAAAdAAAAJgAAABsAAABVAAAAIQAAACEAAACDAAAANgAAAC0AAAAeAAAAHAAAABIAAAI9AAAAqAAAADkAAAAeAAAALwAAAE0AAAAfAAAAKQAAAB0AAABGAAAAOwAAABwAAAAfAAAAYQAAACcAAAArAAAAaAAAACUAAAAeAAAAHQAAAGEAAAAxAAAAIAAAAC0AAAB9AAAAMQAAADMAAABAAAAAWQAAAD8AAAApAAAAKwAAAC4AAAArAAAAHAAAACcAAABBAAAAMQAAADgAAAAvAAAApAAAAEMAAAAuAAAANQAAAE4AAAAqAAAAMgAAAB8AAAC8AAAAOAAAACQAAAA3AAAAgwAAAC0AAAAgAAAAGgAAAEsAAABCAAAAJAAAACUAAAA3AAAANQAAACEAAAAaAAAASwAAADEAAAAaAAAAJQAAAH4AAAA8AAAAIQAAADEAAAB1AAAAJQAAAB4AAAAmAAAAZQAAADcAAAAnAAAAXQAAACkAAAAiAAAAHgAAAJQAAABFAAAALgAAACgAAABfAAAANAAAADAAAAAdAAAAtQAAADwAAAAjAAAAPgAAAGMAAAAtAAAAIQAAAC4AAABUAAAAJgAAAB8AAAAcAAAAbQAAACsAAAAeAAAAOgAAAGAAAAA2AAAAKQAAACYAAABDAAAANgAAACoAAACLAAAAQwAAADgAAAApAAAAWQAAADcAAAAvAAAAKAAAAGwAAAA3AAAALQAAADAAAABkAAAANAAAACgAAAA5AAAAVgAAADMAAAAsAAAAJQAAAF8AAAAwAAAAJwAAACYAAABdAAAAOwAAACgAAAAsAAAAVQAAACgAAAAyAAAAKgAAAFAAAABCAAAALQAAACIAAABOAAAARwAAACoAAAAsAAAASQAAAC8AAAAmAAAAKQAAAHQAAAAuAAAAJgAAACUAAACaAAAASQAAACUAAAAlAAAAtwAAADUAAAAwAAAANgAAAG8AAAA7AAAAOgAAACoAAABnAAAANAAAACMAAAA9AAAAawAAAD0AAAAfAAAAHQAAAE0AAAAjAAAAHwAAACkAAAAdAAAAPgAAABwAAAAbAAAAbgAAAC8AAAAfAAAAGgAAAGwAAAA3AAAAHAAAAC4AAACCAAAANwAAACIAAAApAAAAagAAADcAAAAiAAAAMQAAAF4AAAA4AAAAIAAAACsAAABxAAAAKwAAAB8AAAAmAAAAWQAAACoAAAAgAAAALQAAAG8AAABIAAAAJgAAACgAAABXAAAAJwAAABgAAAAwAAAAlAAAADwAAAA8AAAALgAAAG0AAABJAAAANQAAACEAAABZAAAANAAAACEAAAAgAAAASgAAACsAAAAdAAAAHwAAAEgAAAAnAAAAKAAAABkAAAA6AAAAJwAAAB4AAAAYAAABogAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY1OC4yOS4xMDA=\" type=\"video/mp4\">\n",
       "        </video>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "video_folder = \"logs/8_c/\"\n",
    "video_length = 500\n",
    "\n",
    "video_file = record_video(env_name, video_folder, video_length, model)\n",
    "\n",
    "play_video(video_file)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pushing to Huggingface\n",
    "The model really looks cool. It has trained very well under PPO using the state of the art implementation. We must share it with others. Here is the code from previous chapters to push it to HuggingFace hub."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "287d7da828b5499f936459d9aabae049",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(HTML(value='<center> <img\\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.sv…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from huggingface_sb3 import load_from_hub, package_to_hub, push_to_hub\n",
    "from huggingface_hub import notebook_login # To log to our Hugging Face account to be able to upload models to the Hub.\n",
    "\n",
    "notebook_login()\n",
    "!git config --global credential.helper store"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**IMPORTANT**\n",
    "Some users have reported facing following error while running the `package_to_hub` upload function. \n",
    "\n",
    "```\n",
    "\"Token is required (write-access action) but no token found. You need to provide a token or be logged in to Hugging Face with `huggingface-cli login` or `huggingface_hub.login`. See https://huggingface.co/settings/tokens.\"\n",
    "```\n",
    "\n",
    "In such a case the following command will help you over come the issue\n",
    "\n",
    "```\n",
    "import huggingface_hub\n",
    "\n",
    "huggingface_hub.login(token= <YOUR_HF_TOKEN>,\n",
    "                     write_permission = True,\n",
    "                    add_to_git_credential = True)\n",
    "\t\t\t\t\t\n",
    "```\n",
    "\n",
    "Another alternative is to use following command from command shell where the `venv` or `conda` environment for this repository has been activated and then follow the instructions to set the HuggingFace token.\n",
    "\n",
    "```\n",
    "huggingface-cli login\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;4mℹ This function will save, evaluate, generate a video of your agent,\n",
      "create a model card and push everything to the hub. It might take up to 1min.\n",
      "This is a work in progress: if you encounter a bug, please open an issue.\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/nsanghi/sandbox/apress/drl-2ed/venv39/lib/python3.9/site-packages/stable_baselines3/common/evaluation.py:67: UserWarning: Evaluation environment is not wrapped with a ``Monitor`` wrapper. This may result in reporting modified episode lengths and rewards, if other wrappers happen to modify these. Consider wrapping environment first with ``Monitor`` wrapper.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving video to /tmp/tmp7glebltb/-step-0-to-step-1000.mp4\n",
      "Moviepy - Building video /tmp/tmp7glebltb/-step-0-to-step-1000.mp4.\n",
      "Moviepy - Writing video /tmp/tmp7glebltb/-step-0-to-step-1000.mp4\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                                                                        \r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Moviepy - Done !\n",
      "Moviepy - video ready /tmp/tmp7glebltb/-step-0-to-step-1000.mp4\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers\n",
      "  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)\n",
      "  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared\n",
      "  libavutil      56. 70.100 / 56. 70.100\n",
      "  libavcodec     58.134.100 / 58.134.100\n",
      "  libavformat    58. 76.100 / 58. 76.100\n",
      "  libavdevice    58. 13.100 / 58. 13.100\n",
      "  libavfilter     7.110.100 /  7.110.100\n",
      "  libswscale      5.  9.100 /  5.  9.100\n",
      "  libswresample   3.  9.100 /  3.  9.100\n",
      "  libpostproc    55.  9.100 / 55.  9.100\n",
      "Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/tmp7glebltb/-step-0-to-step-1000.mp4':\n",
      "  Metadata:\n",
      "    major_brand     : isom\n",
      "    minor_version   : 512\n",
      "    compatible_brands: isomiso2avc1mp41\n",
      "    encoder         : Lavf58.29.100\n",
      "  Duration: 00:00:20.02, start: 0.000000, bitrate: 22 kb/s\n",
      "  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 600x400, 17 kb/s, 50 fps, 50 tbr, 12800 tbn, 100 tbc (default)\n",
      "    Metadata:\n",
      "      handler_name    : VideoHandler\n",
      "      vendor_id       : [0][0][0][0]\n",
      "Stream mapping:\n",
      "  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))\n",
      "Press [q] to stop, [?] for help\n",
      "[libx264 @ 0x56083c44f340] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2\n",
      "[libx264 @ 0x56083c44f340] profile High, level 3.1, 4:2:0, 8-bit\n",
      "[libx264 @ 0x56083c44f340] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00\n",
      "Output #0, mp4, to '/tmp/tmp0aoftfjt/replay.mp4':\n",
      "  Metadata:\n",
      "    major_brand     : isom\n",
      "    minor_version   : 512\n",
      "    compatible_brands: isomiso2avc1mp41\n",
      "    encoder         : Lavf58.76.100\n",
      "  Stream #0:0(und): Video: h264 (avc1 / 0x31637661), yuv420p(progressive), 600x400, q=2-31, 50 fps, 12800 tbn (default)\n",
      "    Metadata:\n",
      "      handler_name    : VideoHandler\n",
      "      vendor_id       : [0][0][0][0]\n",
      "      encoder         : Lavc58.134.100 libx264\n",
      "    Side data:\n",
      "      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A\n",
      "frame= 1001 fps=738 q=-1.0 Lsize=      56kB time=00:00:19.96 bitrate=  23.2kbits/s speed=14.7x    \n",
      "video:44kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 28.459061%\n",
      "[libx264 @ 0x56083c44f340] frame I:5     Avg QP:10.38  size:   466\n",
      "[libx264 @ 0x56083c44f340] frame P:260   Avg QP:17.39  size:    65\n",
      "[libx264 @ 0x56083c44f340] frame B:736   Avg QP:16.63  size:    34\n",
      "[libx264 @ 0x56083c44f340] consecutive B-frames:  1.2%  1.4%  2.7% 94.7%\n",
      "[libx264 @ 0x56083c44f340] mb I  I16..4: 93.3%  5.1%  1.7%\n",
      "[libx264 @ 0x56083c44f340] mb P  I16..4:  0.3%  0.0%  0.0%  P16..4:  1.2%  0.2%  0.0%  0.0%  0.0%    skip:98.2%\n",
      "[libx264 @ 0x56083c44f340] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  1.3%  0.1%  0.0%  direct: 0.0%  skip:98.6%  L0:55.2% L1:44.5% BI: 0.3%\n",
      "[libx264 @ 0x56083c44f340] 8x8 transform intra:6.0% inter:35.5%\n",
      "[libx264 @ 0x56083c44f340] coded y,uvDC,uvAC intra: 1.1% 3.1% 1.7% inter: 0.0% 0.1% 0.0%\n",
      "[libx264 @ 0x56083c44f340] i16 v,h,dc,p: 91%  6%  4%  0%\n",
      "[libx264 @ 0x56083c44f340] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 34% 40% 26%  0%  0%  0%  0%  0%  0%\n",
      "[libx264 @ 0x56083c44f340] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 52% 20% 25%  0%  0%  1%  1%  0%  1%\n",
      "[libx264 @ 0x56083c44f340] i8c dc,h,v,p: 84%  0% 16%  0%\n",
      "[libx264 @ 0x56083c44f340] Weighted P-Frames: Y:0.0% UV:0.0%\n",
      "[libx264 @ 0x56083c44f340] ref P L0: 65.5%  1.9% 23.6%  9.0%\n",
      "[libx264 @ 0x56083c44f340] ref B L0: 84.6% 12.8%  2.6%\n",
      "[libx264 @ 0x56083c44f340] ref B L1: 91.2%  8.8%\n",
      "[libx264 @ 0x56083c44f340] kb/s:17.71\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;4mℹ Pushing repo nsanghi/ppo-cart-pole-sb3 to the Hugging Face Hub\u001b[0m\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ed1530db7cd0433d908bb9e0006481a6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "pytorch_variables.pth:   0%|          | 0.00/864 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0ed5871121cc45e8bd3cbbdda5bafead",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Upload 4 LFS files:   0%|          | 0/4 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8706bb48f6df4949b116c8ae25d347e6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "policy.pth:   0%|          | 0.00/41.1k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1c72c31f4f064bc5810fd02b597830ba",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "policy.optimizer.pth:   0%|          | 0.00/82.9k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2b2e5eec676f4755bffa98388b3c906d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "PPO-CartPole-v1.zip:   0%|          | 0.00/139k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;4mℹ Your model is pushed to the Hub. You can view your model here:\n",
      "https://huggingface.co/nsanghi/ppo-cart-pole-sb3/tree/main/\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'https://huggingface.co/nsanghi/ppo-cart-pole-sb3/tree/main/'"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "eval_env = DummyVecEnv([lambda: gym.make(env_name, render_mode=\"rgb_array\")])\n",
    "obs = eval_env.reset()\n",
    "\n",
    "# method save, evaluate, generate a model card and record a replay video of your agent before pushing the repo to the hub\n",
    "\n",
    "# Please note repo_id is of the form <huggingface_id>/<name of repo>\n",
    "# you will need to change this to \"<your_huggingface_id>/ppo-cart-pole-v1\"\n",
    "\n",
    "package_to_hub(model=model, # Our trained model\n",
    "               model_name= \"PPO-\" + env_name, # The name of our trained model\n",
    "               model_architecture=\"PPO\", # The model architecture we used: in our case PPO\n",
    "               env_id=env_name, # Name of the environment\n",
    "               eval_env=eval_env, # Evaluation Environment\n",
    "               repo_id=\"nsanghi/ppo-cart-pole-sb3\", # id of the model repository from the Hugging Face Hub (repo_id = {organization}/{repo_name}\n",
    "               commit_message=\"Push to Hub\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
